昨天把資料對齊了。今天要處理一個更根本的問題:對齊之後,我們要對什麼東西建模?
如果直接把 30 個參數丟進 XGBoost,也會出東西,而且準度可能還不錯。但那個模型只會告訴你「這捲大概會不良」,不會告訴你「往哪個方向調、調多少」。
差別在有沒有物理骨架。
今天就來拆這個骨架。
從模頭出來那一刻
先講一件我一開始搞錯的事。
我原本以為,模頭的孔開多大,出來的料就多粗。這個直覺在金屬加工大致成立,但在高分子押出完全不對。
熔融塑料從模頭擠出來的瞬間,會膨脹。
原因是:料在螺桿和模頭流道裡被擠壓、被剪切,高分子鏈被拉直、被定向。一離開模頭,約束消失,那些被拉直的鏈會彈回去,材料就在徑向脹開。這個現象叫 die swell(模頭膨脹),也叫 Barus effect。
膨脹比可以到 1.2~2 倍,而且不是常數——它跟剪切速率有關(押得越快脹越多)、跟溫度有關(溫度越高鬆弛越快、脹越少)、跟材料有關(分子量分布越寬脹越多)。
這件事很關鍵,因為它意味著:同一副模具、同樣的料,你只要改了螺桿轉速或溫度,出模的尺寸就變了。
然後,線材被牽引拉走,又被拉細。
所以最終外徑是這兩件事打架的結果:模頭膨脹把它撐大,牽引拉伸把它拉小。
最重要的一條式子:拉伸比
把整個押出站抽象到最簡,其實就是一個質量守恆。
單位時間內,從模頭出去的料的體積,等於纏到收線盤上的料的體積(忽略密度變化):
Q = A_出模 × v_出模 = A_成品 × v_牽引
其中 A 是包覆層的環形截面積。定義 DDR(Draw Down Ratio,拉伸比):
DDR = A_出模 / A_成品 = v_牽引 / v_出模
拉伸比就是牽引速度比出料速度快多少倍。押出常見的 DDR 大概在 1.5~8 之間,看製程。
把它展開成可以算的形式。設:
模具:模套內徑 D_die、模芯外徑 d_tip
成品:外被外徑 D_od、導體(內層)外徑 d_core
出模的環形面積:
A_die = π/4 × (D_die² − d_tip²)
成品的環形面積:
A_prod = π/4 × (D_od² − d_core²)
由 DDR = A_die / A_prod,反推成品外徑:
D_od = sqrt( d_core² + (D_die² − d_tip²) / DDR )
而 DDR 又可以從流量和線速算:
DDR = A_die × v_die / (A_prod × v_line)
繞了一圈,實務上更好用的是直接從質量流率算。因為押出機的產出量 ṁ(kg/hr)跟螺桿轉速 N 近似線性:
ṁ ≈ k × N (k 由螺桿幾何和料性決定)
那麼包覆層的截面積:
A_prod = ṁ / (ρ_melt × v_line)
D_od = sqrt( d_core² + 4ṁ / (π × ρ × v_line) )
這條式子是整個押出孿生模型的核心。它說的是:
螺桿轉速 ↑ → 出料量 ↑ → 外徑 ↑
牽引速度 ↑ → 拉伸比 ↑ → 外徑 ↓
導體外徑 ↑ → 成品外徑 ↑(直接疊上去)
注意這裡面沒有溫度。
那為什麼 Day 1 的師傅在調溫度?為什麼 Day 3 我們發現溫度跟外徑是負相關?
溫度從哪裡進來
溫度不在質量守恆裡,它從三個地方偷偷進來。
第一,熔體密度。 溫度高,ρ_melt 下降。同樣的體積流量,質量流率會變。但這個效應通常不大。
第二,黏度,再影響實際流量。 這是主要路徑。
高分子是剪切變稀(shear-thinning)的非牛頓流體,黏度隨溫度呈 Arrhenius 型下降:
η(T, γ̇) = η₀ × exp( E/R × (1/T − 1/T_ref) ) × γ̇^(n−1)
溫度升高 → 黏度下降 → 模頭壓力下降 → 在相同螺桿轉速下,漏流(back flow)增加、實際產出量略降。同時黏度低的料更容易被拉細。
第三,die swell。 前面說過,溫度高 → 鬆弛快 → 膨脹比小 → 出模尺寸小。
這三條路的合力,大部分情況下是:溫度 ↑ → 外徑 ↓。
這就對上了 Day 3 那個負係數,也對上了師傅的操作直覺。
物理模型的價值就在這裡:它不只給你數字,它給你一個可以檢驗資料的參考答案。 當模型跟物理不一致的時候,你知道該回去查資料,而不是接受模型。
冷卻:被忽略的那一段
料出了模頭、被拉細之後,還要進水槽定形。這一段常被當成「反正就是冷卻」,但它決定兩件事。
收縮。 從熔融態(~200°C)冷到室溫,體積會縮。半結晶材料(PE、PP)因為結晶會額外收縮,線收縮率可能到 1.5~3%;非晶材料(PVC)小一些。所以熱態外徑 ≠ 冷態外徑,而測徑儀通常裝在水槽之後量冷態。
如果水槽長度或水溫變了,料出水槽時的芯部溫度不同,後續在收線盤上還會繼續縮——這就是「剛量是對的,隔天量變小了」的來源。
應力凍結。 冷太快,表層先固化、芯部後固化,內應力會被凍在裡面。短期看不出來,長期會造成護套收縮、開裂、與內層剝離。
冷卻可以寫成一維徑向熱傳導:
∂T/∂t = α × (1/r × ∂/∂r (r × ∂T/∂r))
配上表面對流邊界條件 h(水溫、水流)。實務上不一定要真的解 PDE,可以用一個集總參數的指數衰減先近似,不夠準再補。
所以物理模型能到哪裡
我把押出站的物理骨架寫成程式碼,大概長這樣:
python
import numpy as np
class ExtrusionPhysics:
"""押出製程的一階物理模型:質量守恆 + 溫度修正 + 冷卻收縮"""
def __init__(self, k_screw, rho_ref=940.0, T_ref=200.0,
beta_rho=-6.5e-4, beta_swell=-1.2e-3,
shrink_rate=0.02):
self.k_screw = k_screw # kg/hr per rpm,由試車標定
self.rho_ref = rho_ref # 參考溫度下熔體密度 kg/m3
self.T_ref = T_ref
self.beta_rho = beta_rho # 密度溫度係數 (1/°C)
self.beta_swell = beta_swell # die swell 的溫度修正 (1/°C)
self.shrink_rate= shrink_rate # 冷卻線收縮率
def melt_density(self, T_melt):
return self.rho_ref * (1 + self.beta_rho * (T_melt - self.T_ref))
def mass_flow(self, screw_rpm):
"""kg/hr → kg/s"""
return self.k_screw * screw_rpm / 3600.0
def hot_od(self, screw_rpm, line_speed, d_core, T_melt):
"""
熱態外徑 (m)
screw_rpm : rpm
line_speed: m/s
d_core : 內層外徑 m
T_melt : °C
"""
m_dot = self.mass_flow(screw_rpm) # kg/s
rho = self.melt_density(T_melt) # kg/m3
A_ann = m_dot / (rho * line_speed) # m2 環形截面積
od = np.sqrt(d_core**2 + 4 * A_ann / np.pi)
# die swell 的溫度修正:溫度高 → 膨脹小 → 外徑再縮一點
od *= (1 + self.beta_swell * (T_melt - self.T_ref))
return od
def cold_od(self, *args, **kwargs):
"""冷態外徑 = 熱態 × (1 - 線收縮率)"""
return self.hot_od(*args, **kwargs) * (1 - self.shrink_rate)
def sensitivity(self, base, delta=1e-3):
"""數值偏微分:每個參數動一單位,外徑動多少 (mm)"""
out = {}
base_od = self.cold_od(**base)
for key in base:
pert = dict(base)
step = max(abs(base[key]) * delta, 1e-6)
pert[key] = base[key] + step
out[key] = (self.cold_od(**pert) - base_od) / step * 1000
return base_od, out
phys = ExtrusionPhysics(k_screw=1.85) # 由試車資料標定
base = dict(screw_rpm=62.0,
line_speed=3.0,
d_core=0.00420, # 4.20 mm
T_melt=185.0)
od, sens = phys.sensitivity(base)
print(f"predicted cold OD = {od*1000:.3f} mm\n")
for k, v in sens.items():
print(f" d(OD)/d({k:<11}) = {v:+.5f} mm per unit")
輸出大致會是這種形式:
predicted cold OD = 5.412 mm
d(OD)/d(screw_rpm ) = +0.02xxx mm per rpm
d(OD)/d(line_speed) = -0.4xxxx mm per (m/s)
d(OD)/d(d_core ) = +0.8xxxx mm per m
d(OD)/d(T_melt ) = -0.00xxx mm per °C
這組偏微分,就是師傅腦袋裡那張表。
Day 1 那位師傅調三度而不是五度,對應的就是他心裡知道「每度大概動多少」。差別只是他的版本沒有寫下來、沒有辦法傳給別人、也沒有辦法在換料的時候被重新標定。
但物理模型會不準,而且一定會
先誠實講清楚:上面那個模型單獨拿去現場用,會有偏差。原因很多:
k_screw 不是常數,螺桿磨損、料的顆粒形狀、喂料段溫度都會影響
收縮率跟冷卻歷程有關,不是一個固定值
die swell 的建模極度簡化,真實的黏彈行為複雜得多
模具磨損、對心偏差、模頭積料,全部沒進來
環境溫濕度、原料批次差異,完全沒有
所以下一步不是把物理模型做得更複雜,而是接受它不完美,然後用資料補殘差:
OD_實際 = f_物理(參數) + g_資料(參數, 情境)
f_物理 給方向和量級,g_資料 學那些物理抓不到的東西。這個叫殘差建模 / 混合模型(hybrid modeling),是我認為最適合這類製造場景的架構。
好處很直接:
外插安全。 純資料模型遇到沒看過的規格會亂猜,物理骨架會把它拉住。
可解釋。 你可以告訴師傅「物理算出來是 5.41,實際偏大 0.03,殘差模型認為是因為這批料比較稠」。
資料需求低。 不用等三年的資料才能上線。
殘差本身就是診斷訊號。 殘差突然變大,通常代表有物理模型沒描述到的東西在變——模具磨損、原料異常。這比直接預測不良更早。
今天的重點
回到 Day 2 說過的那句話:有物理機制,AI 才能做到「進化」,而不只是「預測」。
今天這篇的價值不在那幾條公式,而在於我們現在有了一組有方向、有量級、可以被驗證的因果關係。它讓我們:
能檢驗資料對不對(Day 3 的負係數,現在有物理依據了)
能給出「往哪調」的建議,而不只是「會不良」
能在資料很少的時候就開始有用
能在模型出錯的時候知道是哪裡出錯